/*
 *  DIDDescriptor.h
 *  
 *
 *  Created by Peter on 23.02.12.
 *  Copyright 2012 __MyCompanyName__. All rights reserved.
 *
 */

#ifndef A_DID_DESCRIPTOR_H
#define A_DID_DESCRIPTOR_H

#include "AMediaFileDesc.h"
#include "AvTypes.h"

/*
 * Encapsulates OMFi's 'DIDD' (PCID is even 'DIDD').
 * Vesion: 2 (MC 5.5).
 *
 * Encapsulates basic info about a digital image (probably also a clip).
 * This is an abstract class, RGBADescriptor (RGBA) and CDCIDescriptor (YCbCr)
 * are derived from this.
 */
class DIDDescriptor : public AMediaFileDesc
{
	
public:
	
	A_DECLARE_CLASS( 'DIDD', DIDDescriptor, AMediaFileDesc );
	
	virtual void readFromStream( AStream& str, const AObjDoc& objd );
	virtual void dump( std::ostream& str ) const;
	
	Int32  _storedHeight;          // OMFI:DIDD:StoredHeight: 288
	Int32  _storedWidth;           // OMFI:DIDD:StoredWidth: 720
	Int32  _sampledHeight;         // OMFI:DIDD:SampledHeight: 288
	Int32  _sampledWidth;          // OMFI:DIDD:SampledWidth: 720
	Int32  _sampledXOffset;        // OMFI:DIDD:SampledXOffset: 0
	Int32  _sampledYOffset;        // OMFI:DIDD:SampledYOffset: 0
	Int32  _displayHeight;         // OMFI:DIDD:DisplayHeight: 288
	Int32  _displayWidth;          // OMFI:DIDD:DisplayWidth: 720
	Int32  _displayXOffset;        // OMFI:DIDD:DisplayXOffset: 0
	Int32  _displayYOffset;        // OMFI:DIDD:DisplayYOffset: 0
	Int16  _frameLaout;            // OMFI:DIDD:FrameLayout: 3
	Rational _imageAspectRatio;    // -> Rational         OMFI:DIDD:ImageAspectRatio: 1.333333 // TODO: Determine exact type of fields
	Int32  _videoLineMapSize;      // OMFI:DIDD:VideoLineMapSize: 8 
	Int32* _videoLineMap;         // OMFI:DIDD:VideoLineMap: 15... // size seems to be (VideoLineMapSize / sizeof(Int32)) numbers of size Int32
	Int32  _alphaTransparency;     // OMFI:DIDD:AlphaTransparency: 0
	bool   _uniformness;           // OMFI:DIDD:Uniformness: True
	Int32  _didImageSize;          // OMFI:DIDD:DIDImageSize: 417792
	UInt32 _nextDidDesc;          // OMFI:DIDD:NextDIDDesc: 0x00000000 // DIDDescriptor*
	UInt32 _didCompressMethod;    // OMFI:DIDD:DIDCompressMethod: 'NONE' // type AME::Attribute
	Int32  _didResolutionId;      // OMFI:DIDD:DIDResolutionID: 170
	Int32  _imageAlignmentFactor; // OMFI:DIDD:ImageAlignmentFactor: 8192
	
	// PClass Extension FrameIndexByteOrder
	Int16 _frameIndexByteOrder;  // OMFI:DIDD:FrameIndexByteOrder: 18761
	
	// PClass Extension FrameSampleSize
	Int32 _frameSampleSize;      // OMFI:DIDD:FrameSampleSize: 417792
	
	// PClass Extension FirstFrameOffset
	Int32 _firstFrameOffset;     // OMFI:DIDD:FirstFrameOffset: 0
	
	// PClass Extension ClientFill
	Int32 _clientFillStart;      // OMFI:DIDD:ClientFillStart: 0
	Int32 _clientFillEnd;        //OMFI:DIDD:ClientFillEnd: 0
	
	// PClass Extension OffsetToRLEFrameIndexes
	Int32 _offsetToRleFrameIndexes; // OMFI:DIDD:OffsetToRLEFrameIndexes: -1
	
	// PClass Extension (should be FrameStartOffset according to MC7, but the 
	// version here is different on 5.0.3 and the content doesn't really match 
	// the title of the extension so we're probably dealing with a different one
	// here and FrameStartOffset was dropped?)
	Int32 _validXNum;        // OMFI:DIDD:ValidXNum: -600
	Int32 _validXDen;        // OMFI:DIDD:ValidXDen: 1
	Int32 _validYNum;        // OMFI:DIDD:ValidYNum: -450
	Int32 _validYDen;        // OMFI:DIDD:ValidYDen: 1
	Int32 _validWidthNum;    // OMFI:DIDD:ValidWidthNum: 1200
	Int32 _validWidthDen;    // OMFI:DIDD:ValidWidthDen: 1
	Int32 _validHeighNum;    // OMFI:DIDD:ValidHeightNum: 900
	Int32 _validHeightDen;   // OMFI:DIDD:ValidHeightDen: 1
	Int32 _essenceXNum;      // OMFI:DIDD:EssenceXNum: -600
	Int32 _essenceXDen;      // OMFI:DIDD:EssenceXDen: 1
	Int32 _essenceYNum;      // OMFI:DIDD:EssenceYNum: -450
	Int32 _essenceYDen;      // OMFI:DIDD:EssenceYDen: 1
	Int32 _essenceWidthNum;  // OMFI:DIDD:EssenceWidthNum: 1200
	Int32 _essenceWidthDen;  // OMFI:DIDD:EssenceWidthDen: 1
	Int32 _essenceHeightNum; // OMFI:DIDD:EssenceHeightNum: 900
	Int32 _essenceHeightDen; // OMFI:DIDD:EssenceHeightDen: 1
	Int32 _sourceXNum;       // OMFI:DIDD:SourceXNum: -600
	Int32 _sourceXDen;       // OMFI:DIDD:SourceXDen: 1
	Int32 _sourceYNum;       // OMFI:DIDD:SourceYNum: -450
	Int32 _sourceYDen;       // OMFI:DIDD:SourceYDen: 1
	Int32 _sourceWidthNum;   // OMFI:DIDD:SourceWidthNum: 1200
	Int32 _sourceWidthDen;   // OMFI:DIDD:SourceWidthDen: 1
	Int32 _sourceHeightNum;  // OMFI:DIDD:SourceHeightNum: 900
	Int32 _sourceHeighDen;   // OMFI:DIDD:SourceHeightDen: 1
	
};

#endif /*Inclusion Guard*/